#pragma once
#include <iostream>
#include <string>
#include <stdio.h>
#include <set>
const int line_size = 1024;
class Command
{
public:
    Command()
    {
        _white_command.insert("ls");
        _white_command.insert("pwd");
        _white_command.insert("ls -l");
        _white_command.insert("ll");
        _white_command.insert("touch");
        _white_command.insert("who");
        _white_command.insert("whoami");
    }
    bool SafeCheck(const std::string &command) // 检测传过来的指令是否安全
    {
        auto n = _white_command.find(command);
        return n != _white_command.end();
    }
    std::string Excute(const std::string &command)
    {
        if (!SafeCheck(command))
            return command + "不支持";
        // 正常执行指令
        // 1.pipe
        // 2.fork+dup(pipe[1],1)+exec*,执行结果给父进程(需要进程间通信)
        // 3.return

        // 这里一个popen即可完成上面三点
        FILE *fp = popen(command.c_str(), "r");
        if (fp == nullptr)
            return "Excute filed";
        char buffer[line_size];
        std::string result;
        while (true)
        {
            char *ret = fgets(buffer, sizeof(buffer), fp);
            if (!ret)
            {
                break;
            }
            result += ret;
        }
        pclose(fp);
        return result.empty() ? "Done" : result;
    }
    ~Command()
    {
    }

private:
    std::set<std::string> _white_command; // 白名单,只允许少量指令可以远程执行
};